/*************************************************
  * 描述：通知提示框
  *
  * File：cxinoticebox.h
  * Author：dongyao@mozihealthcare.cn
  * Date：2025/9/28
  * Update：
  * ************************************************/

#ifndef CXINOTICEBOX_H
#define CXINOTICEBOX_H

#include <QFont>
#include <QIcon>
#include <QString>
#include <QVariant>
#include <controls/export.h>
#include <functional>
// 消息级别枚举,数字值越大，级别越高
enum class NoticeLevel
{
	Level1,
	Level2,
	Level3,
	Level4,
	Level5
};
// 消息大小样式枚举
enum class NoticeSizeStyle
{
	Normal,
	Large,
	Larger
};

// 消息类型枚举
enum class NoticeType
{
	Notice, // 通知 Level1
	Message,// 消息 Level1
	Remind, // 提醒 Level2
	Warning,// 警告 Level4
	Confirm,// 确认 Level3
	MQ      // MQ消息Level2
};

// 消息数据结构
struct CXI_CONTROLS_EXPORT NoticeData
{
	QString text;                                              // 消息内容
	QString caption;                                           // 标题
	QIcon icon;                                                // 图标
	int autoPopDelay = 3000;                                   // 自动关闭时长(毫秒)
	NoticeSizeStyle sizeStyle = NoticeSizeStyle::Normal;       // 大小样式
	QSize size;                                                // 大小
	QFont font;                                                // 字体
	QColor backColor;                                          // 背景颜色
	QColor titleColor;                                         //标题颜色
	NoticeLevel level = NoticeLevel::Level1;                   // 消息级别
	NoticeType type = NoticeType::Notice;                      // 消息类型
	bool isConfirmBox = false;                                 // 是否为确认框
	QString confirmBtnText = "确认";                           // 确认按钮文本
	bool isMQ = false;                                         // 是否为MQ消息
	QVariant mqData;                                           // MQ消息附加数据
	std::function<void()> confirmCallback;                     // 确认回调函数
	std::function<void(const QVariant&)> mqClickCallback;      // MQ单击回调函数，携带MQ附加数据
	std::function<void(const QVariant&)> mqDoubleClickCallback;// MQ双击回调函数，携带MQ附加数据
};

class CxiNoticeBoxPrivate;
class CXI_CONTROLS_EXPORT CxiNoticeBox
{
public:
	static CxiNoticeBox& instance();
	// 禁用拷贝和移动构造
	CxiNoticeBox(CxiNoticeBox const&) = delete;
	CxiNoticeBox(CxiNoticeBox&&) = delete;
	CxiNoticeBox& operator=(CxiNoticeBox const&) = delete;
	CxiNoticeBox& operator=(CxiNoticeBox&&) = delete;
	~CxiNoticeBox();

	// 核心接口：显示消息
	static void show(const NoticeData& data);

	/**
	 * @brief 快捷接口：显示通知窗口
	 * @param text 消息内容
	 * @param autoPopDelay 自动关闭时长(毫秒)
	 * @param caption 标题
	 */
	static void showNotice(const QString& text,
						   int autoPopDelay = 3000,
						   const QString& caption = "通知");
	/**
	 * @brief 快捷接口：显示消息窗口
	 * @param text 消息内容
	 * @param autoPopDelay 自动关闭时长(毫秒)
	 * @param caption 标题
	 */
	static void showMessage(const QString& text,
							int autoPopDelay = 3000,
							const QString& caption = "消息");
	/**
	 * @brief 快捷接口：显示提醒窗口
	 * @param text 消息内容
	 * @param autoPopDelay 自动关闭时长(毫秒)
	 * @param caption 标题
	 */
	static void showRemind(const QString& text,
						   int autoPopDelay = 5000,
						   const QString& caption = "提醒");
	/**
	 * @brief 快捷接口：显示警告窗口
	 * @param text 消息内容
	 * @param autoPopDelay 自动关闭时长(毫秒)
	 * @param caption 标题
	 */
	static void showWarning(const QString& text,
							int autoPopDelay = -1,
							const QString& caption = "警告");

	/**
	 * @brief 快捷接口：显示确认窗口
	 * @param text 消息内容
	 * @param confirmCallback 确认回调函数
	 * @param autoPopDelay 自动关闭时长(毫秒)
	 * @param caption 标题
	 * @param btnText 确认按钮文本
	 */
	static void showConfirm(const QString& text,
							std::function<void()> confirmCallback,
							int autoPopDelay = -1,
							const QString& caption = "确认",
							const QString& btnText = "确认");
	/**
	 * @brief 快捷接口：显示MQ消息
	 * @param mqData MQ消息附加数据
	 * @param mqClickCallback MQ单击回调函数
	 * @param mqDoubleClickCallback MQ双击回调函数
	 * @param autoPopDelay 自动关闭时长(毫秒)
	 * @param caption 标题
	 */
	static void showMQ(const QVariant& mqData,
					   std::function<void(const QVariant&)> mqClickCallback,
					   std::function<void(const QVariant&)> mqDoubleClickCallback,
					   int autoPopDelay = -1,
					   const QString& caption = "MQ消息");

	// 设置是否允许显示新消息
	static void setAllowShowNewMsg(bool allow);
	// 清除所有显示的消息
	static void clearAll();
	// 设置最大显示数量
	static void setMaxVisibleCount(int max);
	// 获取最大显示数量
	static int maxVisibleCount();

private:
	CxiNoticeBox();
	Q_DECLARE_PRIVATE(CxiNoticeBox)
	QScopedPointer<CxiNoticeBoxPrivate> d_ptr;
};


#endif//CXINOTICEBOX_H
